package cn.kgc.mybatis;

import cn.kgc.mybatis.entity.User;
import com.mysql.jdbc.Driver;
import org.junit.Before;
import org.junit.Test;

import java.sql.*;
import java.util.ArrayList;

/**
 * @author: 课工场
 * @since 2023/9/21
 * JDBC实现数据库的操作,基本步骤：
 * 1.导包
 * 2.注册驱动
 * 3.获取连接对象
 * 4.获取发送sql语句的对象  statement
 * 5.编写sql 发送sql
 * 6.处理结果集 DQL  select
 * 7.释放资源

 * jdbc存在的不足:
 * 1.获取连接的过程繁琐  jdbcUtil
 * 2.结果集的处理繁琐   DBUtil  反射
 * 3.sql语句和java代码存在耦合
 * 4.实现动态sql需要进行字符串的拼接
 * 5.数据的查询 没有数据缓存  持久层数据库的压力较大
 *
 * mybatis框架 可以解决以上分析的问题
 * 使用步骤：
 * 1.导包  mybatis
 * 2. 编写配置文件   全局配置文件(数据源 事务 mapper的位置)  mapper文件(sql语句)
 * 3. SqlSessionFactoryBuilder  ->  SqlSessionFactory
 * 4. SqlSessionFactory  ->  SqlSession
 * 5. 使用SqlSession完成数据的crud操作
 *
 */
public class JDBCOperation {

    private  Connection connection;
    @Before
    public void init() throws Exception{
        // 创建mysql驱动对象
        Driver driver = new Driver();
        // 注册驱动
        DriverManager.registerDriver(driver);
        //获取连接  Connection
        String username = "root";
        String password = "root";
        // 数据库的连接地址以及数据库名称  http://  jdbc:mysql://
        String url = "jdbc:mysql:///java2322?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=UTF-8";
        connection = DriverManager.getConnection(url, username, password);
        System.out.println("connection = " + connection);
    }

    // 使用jdbc实现数据的查询操作  user
    @Test
    public void selectUser() {

        try {
            // 获取发送sql语句的对象
            String sql = "SELECT  *  from  user";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            // 发送sql语句  mysql
            ResultSet resultSet = preparedStatement.executeQuery();
            //处理结果集
            ArrayList<User> users = new ArrayList<>();
            while (resultSet.next()) {

                long id = resultSet.getInt("id");
                String uname = resultSet.getString(2);
                String pwd = resultSet.getString("password");
                long age = resultSet.getInt("age");

                User user = new User();
                user.setId(id).setUsername(uname).setPassword(pwd).setAge(age);
                users.add(user);
            }

            // 遍历集合  验证数据封装
            for (User user : users) {
                System.out.println("user = " + user);
            }

            // 释放资源
            resultSet.close();
            preparedStatement.close();
            connection.close();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //使用jdbc完成数据的添加
    @Test
    public void addUser() throws  Exception{

        // sql
        String sql = "insert into user(username,password,age)values(?,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        // 在执行sql语句之前设置参数
        preparedStatement.setString(1,"xiaoming");
        preparedStatement.setString(2,"888888");
        preparedStatement.setInt(3,23);
        // 执行sql语句
        preparedStatement.execute();

        preparedStatement.close();
        connection.close();

    }

    // 使用jdbc完成数据的修改
    @Test
    public void updateUser() throws  Exception{

        String sql = "update user set username = ? ,password= ? where id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setString(1,"汤姆");
        preparedStatement.setString(2,"666666");
        preparedStatement.setInt(3,1);

        preparedStatement.execute();

        preparedStatement.close();
        connection.close();

    }

    // 使用jdbc完成数据的删除
    @Test
    public void deleteUser() throws  Exception{

        String sql = "delete from user where id = ?";

        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, 1);
        preparedStatement.execute();

        preparedStatement.close();
        connection.close();
    }


}
